﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Migracion.Data.PeOnline;

namespace Migracion.Process
{

    public class LinksManager
    {
        public const string TipoLinkPorcionTexto = "P";
        public const string TipoLinkADocumento = "D";
        public const string TipoLinkAncla = "A";
        public const string TipoLinkDormido = "S"; // Link dormido, esta en el doc pero no existe el documento destino
        /// <summary>
        /// 
        /// </summary>
        /// <param name="guidDocumentoSae"></param>
        /// <param name="idDocumentoAbeledo"></param>
        /// <param name="citaAbeledo"></param>
        /// <returns></returns>
        public Guid StoreAnchorForDocument(Guid guidDocumentoSae, int idDocumentoAbeledo, string citaAbeledo)
        {
            using (PE_ONLINE_PRODUCCIONEntities ctxPeOnline = new PE_ONLINE_PRODUCCIONEntities())
            {
                // Busco un ancla
                DocumentLinking linkAnchor = (from dl in ctxPeOnline.DocumentLinking
                                              where dl.AnclaAP == citaAbeledo
                                              && dl.IdDocAPOrigen == idDocumentoAbeledo
                                              && dl.TipoLink == TipoLinkAncla
                                              && dl.GuidDocSaeOrigen == guidDocumentoSae
                                              select dl).SingleOrDefault();
                // Si no está la genero
                if (linkAnchor == null)
                {
                    linkAnchor = new DocumentLinking();
                    linkAnchor.Id = Guid.NewGuid();
                    linkAnchor.TipoLink = TipoLinkAncla;
                    linkAnchor.GuidDocSaeOrigen = guidDocumentoSae;
                    linkAnchor.IdDocAPOrigen = idDocumentoAbeledo;
                    linkAnchor.AnclaAP = citaAbeledo;
                    linkAnchor.NumeroArticulo = ObtenerNumeroDeArticulo(citaAbeledo);

                    ctxPeOnline.DocumentLinking.AddObject(linkAnchor);
                    ctxPeOnline.SaveChanges();
                }

                return linkAnchor.Id;
            }
        }

        public DocumentLinking StoreLinkADocumento(Guid guidDocumentoSaeOrigen, Guid guidDocumentoSaeDestino, int idDocumentoAbeledoOrigen, int idDocumentoAbeledoDestino, string citaAbeledo, string textoDentroLink)
        {
            DocumentLinking linkADocumento = null;

            using (PE_ONLINE_PRODUCCIONEntities ctxPeOnline = new PE_ONLINE_PRODUCCIONEntities())
            {
                // Busco un ancla
                IQueryable<DocumentLinking> query = ctxPeOnline.DocumentLinking;

                if (String.IsNullOrEmpty(citaAbeledo))
                {
                    query = query.Where(dl => dl.TipoLink == TipoLinkADocumento);
                }
                else
                {
                    query = query.Where(dl => dl.TipoLink == TipoLinkPorcionTexto && dl.AnclaAP == citaAbeledo);
                }

                query = query.Where(dl => dl.GuidDocSaeOrigen == guidDocumentoSaeOrigen
                                       && dl.GuidDocSaeDestino == guidDocumentoSaeDestino);

                linkADocumento = query.SingleOrDefault();

                // Si no está la genero
                if (linkADocumento == null)
                {
                    linkADocumento = new DocumentLinking();
                    linkADocumento.Id = Guid.NewGuid();
                    linkADocumento.GuidDocSaeOrigen = guidDocumentoSaeOrigen;
                    linkADocumento.GuidDocSaeDestino = guidDocumentoSaeDestino;
                    linkADocumento.IdDocAPOrigen = idDocumentoAbeledoOrigen;
                    linkADocumento.IdDocAPDestino = idDocumentoAbeledoDestino;
                    linkADocumento.TextoMarcado = textoDentroLink;

                    if (!String.IsNullOrEmpty(citaAbeledo))
                    {
                        linkADocumento.NumeroArticulo = ObtenerNumeroDeArticulo(citaAbeledo);
                        linkADocumento.TipoLink = TipoLinkPorcionTexto;
                        linkADocumento.AnclaAP = citaAbeledo;
                        // Genero un ancla para el documento de legislación
                        Guid anchor = StoreAnchorForDocument(guidDocumentoSaeDestino, idDocumentoAbeledoDestino, citaAbeledo);
                        linkADocumento.GuidAnclaDocDestino = anchor;
                    }
                    else
                    {
                        linkADocumento.TipoLink = TipoLinkADocumento;
                    }


                    ctxPeOnline.DocumentLinking.AddObject(linkADocumento);
                    ctxPeOnline.SaveChanges();
                }
            }

            return linkADocumento;
        }

        public DocumentLinking StoreLinkADocumentoDormido(Guid guidDocumentoSaeOrigen, int idDocumentoAbeledoOrigen, string citaAbeledo, string textoDentroLink)
        {
            using (PE_ONLINE_PRODUCCIONEntities ctxPeOnline = new PE_ONLINE_PRODUCCIONEntities())
            {
                DocumentLinking linkADocumento = ctxPeOnline.DocumentLinking.Where(d => ((d.AnclaAP == citaAbeledo) || (d.AnclaAP == null && citaAbeledo == "") || (d.AnclaAP == null && citaAbeledo == null))
                    && d.GuidDocSaeOrigen == guidDocumentoSaeOrigen
                    && !d.GuidDocSaeDestino.HasValue
                    && d.TipoLink == TipoLinkDormido).FirstOrDefault();

                // Si no está la genero
                if (linkADocumento == null)
                {
                    linkADocumento = new DocumentLinking();
                    linkADocumento.Id = Guid.NewGuid();
                    linkADocumento.GuidDocSaeOrigen = guidDocumentoSaeOrigen;
                    linkADocumento.GuidDocSaeDestino = null;
                    linkADocumento.IdDocAPOrigen = idDocumentoAbeledoOrigen;
                    linkADocumento.IdDocAPDestino = null;
                    linkADocumento.TextoMarcado = textoDentroLink;

                    if (!String.IsNullOrEmpty(citaAbeledo))
                    {
                        linkADocumento.AnclaAP = citaAbeledo;
                        linkADocumento.NumeroArticulo = ObtenerNumeroDeArticulo(citaAbeledo);
                        //  No Genero un ancla para el documento de legislación porque es un link dormido
                        //Guid anchor = StoreAnchorForDocument(guidDocumentoSaeDestino, idDocumentoAbeledoDestino, citaAbeledo);
                        //linkALegislacion.GuidAnclaDocDestino = anchor;
                    }
                    else
                    {
                        linkADocumento.TipoLink = TipoLinkADocumento;
                    }

                    linkADocumento.TipoLink = TipoLinkDormido;

                    ctxPeOnline.DocumentLinking.AddObject(linkADocumento);
                    ctxPeOnline.SaveChanges();
                }

                return linkADocumento;
            }
        }

        private string ObtenerNumeroDeArticulo(string cita)
        {
            string retVal = null;
            if (cita.StartsWith("Art_"))
            {
                if (cita.Length > 14)
                {
                    cita = cita.Substring(4, cita.Length - 4).Replace("_", " ");
                    int period = cita.IndexOf(".");
                    if (period > 8 || period < 0)
                    {
                        period = cita.IndexOf(",");
                    }

                    retVal = cita.Substring(0, period);
                }
                else
                {
                    retVal = cita.Substring(4, cita.Length - 4).Replace("_", " ");
                }
            }

            return retVal;
        }
    }
}
